package com.towker.core.mybatis.dialect;

/**
 * @author badqiu
 */
public class DB2Dialect extends Dialect
{
	public boolean supportsLimit()
	{
		return true;
	}

	public boolean supportsLimitOffset()
	{
		return true;
	}

	private static String getRowNumber(String sql)
	{
		StringBuffer rownumber = new StringBuffer(50).append("rownumber() over(");
		int orderByIndex = sql.toLowerCase().indexOf("order by");
		if (orderByIndex > 0 && !hasDistinct(sql))
		{
			rownumber.append(sql.substring(orderByIndex));
		}
		rownumber.append(") as rownumber_,");
		return rownumber.toString();
	}

	private static boolean hasDistinct(String sql)
	{
		return sql.toLowerCase().indexOf("select distinct") >= 0;
	}

	public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder)
	{
		int startOfSelect = sql.toLowerCase().indexOf("select");
		StringBuffer pagingSelect = new StringBuffer(sql.length() + 100).append(sql.substring(0, startOfSelect)) // add
																													// the
																													// comment
				.append("select * from ( select ") // nest the main query in an outer select
				.append(getRowNumber(sql)); // add the rownnumber bit into the outer query select list
		if (hasDistinct(sql))
		{
			pagingSelect.append(" row_.* from ( ") // add another (inner) nested select
					.append(sql.substring(startOfSelect)) // add the main query
					.append(" ) as row_"); // close off the inner nested select
		}
		else
		{
			pagingSelect.append(sql.substring(startOfSelect + 6)); // add the main query
		}
		pagingSelect.append(" ) as temp_ where rownumber_ ");
		// add the restriction to the outer select
		if (offset > 0)
		{
			// int end = offset + limit;
			String endString = offsetPlaceholder + "+" + limitPlaceholder;
			pagingSelect.append("between " + offsetPlaceholder + "+1 and " + endString);
		}
		else
		{
			pagingSelect.append("<= " + limitPlaceholder);
		}
		return pagingSelect.toString();
	}

	public static void main(String[] args)
	{
		String sql = "select * from users";
		Dialect dia = new DB2Dialect();
		String str = dia.getLimitString(sql, 10, 10);
		System.out.println(str);
	}

	@Override
	public String getCountSql(String sql)
	{
		// TODO Auto-generated method stub
		return null;
	}
}
